// Copyright Epic Games, Inc. All Rights Reserved. // 版权声明

#pragma once // 头文件保护宏，防止重复包含

#include "ActiveGameplayEffectHandle.h" // 包含游戏效果句柄的头文件
#include "Engine/DataAsset.h" // 包含数据资产类的头文件
#include "AttributeSet.h" // 包含属性集类的头文件
#include "GameplayTagContainer.h" // 包含游戏标签容器的头文件

#include "GameplayAbilitySpecHandle.h" // 包含游戏能力规格句柄的头文件
#include "LyraAbilitySet.generated.h" // 包含生成的反射代码头文件

class UAttributeSet; // 前向声明属性集类
class UGameplayEffect; // 前向声明游戏效果类
class ULyraAbilitySystemComponent; // 前向声明Lyra能力系统组件类
class ULyraGameplayAbility; // 前向声明Lyra游戏能力类
class UObject; // 前向声明基础对象类

/**
 * FLyraAbilitySet_GameplayAbility
 *
 *	Data used by the ability set to grant gameplay abilities.
 *	能力集用于授予游戏能力的数据结构
 */
USTRUCT(BlueprintType) // USTRUCT宏，标记为蓝图类型
struct FLyraAbilitySet_GameplayAbility
{
	GENERATED_BODY() // 生成结构体反射代码

public:

	// Gameplay ability to grant. // 要授予的游戏能力
	UPROPERTY(EditDefaultsOnly) // 属性宏，仅在编辑默认值时可编辑
	TSubclassOf<ULyraGameplayAbility> Ability = nullptr; //  Lyra游戏能力类的子类引用

	// Level of ability to grant. // 要授予的能力等级
	UPROPERTY(EditDefaultsOnly) // 属性宏，仅在编辑默认值时可编辑
	int32 AbilityLevel = 1; // 能力等级，默认为1

	// Tag used to process input for the ability. // 用于处理能力输入的标签
	UPROPERTY(EditDefaultsOnly, Meta = (Categories = "InputTag")) // 属性宏，带有元数据指定分类
	FGameplayTag InputTag; // 游戏标签，用于输入绑定
};

/**
 * FLyraAbilitySet_GameplayEffect
 *
 *	Data used by the ability set to grant gameplay effects.
 *	能力集用于授予游戏效果的数据结构
 */
USTRUCT(BlueprintType) // USTRUCT宏，标记为蓝图类型
struct FLyraAbilitySet_GameplayEffect
{
	GENERATED_BODY() // 生成结构体反射代码

public:

	// Gameplay effect to grant. // 要授予的游戏效果
	UPROPERTY(EditDefaultsOnly) // 属性宏，仅在编辑默认值时可编辑
	TSubclassOf<UGameplayEffect> GameplayEffect = nullptr; // 游戏效果类的子类引用

	// Level of gameplay effect to grant. // 要授予的游戏效果等级
	UPROPERTY(EditDefaultsOnly) // 属性宏，仅在编辑默认值时可编辑
	float EffectLevel = 1.0f; // 效果等级，默认为1.0
};

/**
 * FLyraAbilitySet_AttributeSet
 *
 *	Data used by the ability set to grant attribute sets.
 *	能力集用于授予属性集的数据结构
 */
USTRUCT(BlueprintType) // USTRUCT宏，标记为蓝图类型
struct FLyraAbilitySet_AttributeSet
{
	GENERATED_BODY() // 生成结构体反射代码

public:
	// Gameplay effect to grant. // 要授予的属性集
	UPROPERTY(EditDefaultsOnly) // 属性宏，仅在编辑默认值时可编辑
	TSubclassOf<UAttributeSet> AttributeSet; // 属性集类的子类引用

};

/**
 * FLyraAbilitySet_GrantedHandles
 *
 *	Data used to store handles to what has been granted by the ability set.
 *	用于存储能力集已授予内容句柄的数据结构
 */
USTRUCT(BlueprintType) // USTRUCT宏，标记为蓝图类型
struct FLyraAbilitySet_GrantedHandles
{
	GENERATED_BODY() // 生成结构体反射代码

public:

	void AddAbilitySpecHandle(const FGameplayAbilitySpecHandle& Handle); // 添加能力规格句柄的函数声明
	void AddGameplayEffectHandle(const FActiveGameplayEffectHandle& Handle); // 添加游戏效果句柄的函数声明
	void AddAttributeSet(UAttributeSet* Set); // 添加属性集的函数声明

	void TakeFromAbilitySystem(ULyraAbilitySystemComponent* LyraASC); // 从能力系统移除所有已授予内容的函数声明

protected:

	// Handles to the granted abilities. // 已授予能力的句柄数组
	UPROPERTY() // 属性宏
	TArray<FGameplayAbilitySpecHandle> AbilitySpecHandles; // 游戏能力规格句柄数组

	// Handles to the granted gameplay effects. // 已授予游戏效果的句柄数组
	UPROPERTY() // 属性宏
	TArray<FActiveGameplayEffectHandle> GameplayEffectHandles; // 活跃游戏效果句柄数组

	// Pointers to the granted attribute sets // 指向已授予属性集的指针数组
	UPROPERTY() // 属性宏
	TArray<TObjectPtr<UAttributeSet>> GrantedAttributeSets; // 属性集对象指针数组
};

/**
 * ULyraAbilitySet
 *
 *	Non-mutable data asset used to grant gameplay abilities and gameplay effects.
 *	不可变的数据资产，用于授予游戏能力和游戏效果
 */
UCLASS(BlueprintType, Const) // UCLASS宏，标记为蓝图类型且为常量
class ULyraAbilitySet : public UPrimaryDataAsset // 继承自主数据资产类
{
	GENERATED_BODY() // 生成类反射代码

public:

	ULyraAbilitySet(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); // 构造函数声明

	// Grants the ability set to the specified ability system component.
	// The returned handles can be used later to take away anything that was granted.
	// 将能力集授予指定的能力系统组件
	// 返回的句柄可用于后续移除所有已授予的内容
	void GiveToAbilitySystem(ULyraAbilitySystemComponent* LyraASC, FLyraAbilitySet_GrantedHandles* OutGrantedHandles, UObject* SourceObject = nullptr) const; // 授予能力集给能力系统组件的函数声明

protected:

	// Gameplay abilities to grant when this ability set is granted. // 当此能力集被授予时要授予的游戏能力数组
	UPROPERTY(EditDefaultsOnly, Category = "Gameplay Abilities", meta=(TitleProperty=Ability)) // 属性宏，指定分类和标题属性
	TArray<FLyraAbilitySet_GameplayAbility> GrantedGameplayAbilities; // 游戏能力结构体数组

	// Gameplay effects to grant when this ability set is granted. // 当此能力集被授予时要授予的游戏效果数组
	UPROPERTY(EditDefaultsOnly, Category = "Gameplay Effects", meta=(TitleProperty=GameplayEffect)) // 属性宏，指定分类和标题属性
	TArray<FLyraAbilitySet_GameplayEffect> GrantedGameplayEffects; // 游戏效果结构体数组

	// Attribute sets to grant when this ability set is granted. // 当此能力集被授予时要授予的属性集数组
	UPROPERTY(EditDefaultsOnly, Category = "Attribute Sets", meta=(TitleProperty=AttributeSet)) // 属性宏，指定分类和标题属性
	TArray<FLyraAbilitySet_AttributeSet> GrantedAttributes; // 属性集结构体数组
};